/*!
 * UEditor
 * version: ueditor
 * build: Tue Aug 25 2015 15:27:16 GMT+0800 (CST)
 */

(function() {

	(function() {
		UEP = window.UE || {};

		var isIE = !!window.ActiveXObject;
		//定义utils工具
		var utils = {
			removeLastbs : function(url) {
				return url.replace(/\/$/, '');
			},
			extend : function(t, s) {
				var a = arguments, notCover = this.isBoolean(a[a.length - 1]) ? a[a.length - 1]
						: false, len = this.isBoolean(a[a.length - 1]) ? a.length - 1
						: a.length;
				for (var i = 1; i < len; i++) {
					var x = a[i];
					for ( var k in x) {
						if (!notCover || !t.hasOwnProperty(k)) {
							t[k] = x[k];
						}
					}
				}
				return t;
			},
			isIE : isIE,
			cssRule : isIE ? function(key, style, doc) {
				var indexList, index;
				doc = doc || document;
				if (doc.indexList) {
					indexList = doc.indexList;
				} else {
					indexList = doc.indexList = {};
				}
				var sheetStyle;
				if (!indexList[key]) {
					if (style === undefined) {
						return '';
					}
					sheetStyle = doc.createStyleSheet('',
							index = doc.styleSheets.length);
					indexList[key] = index;
				} else {
					sheetStyle = doc.styleSheets[indexList[key]];
				}
				if (style === undefined) {
					return sheetStyle.cssText
				}
				sheetStyle.cssText = sheetStyle.cssText + '\n' + (style || '');
			} : function(key, style, doc) {
				doc = doc || document;
				var head = doc.getElementsByTagName('head')[0], node;
				if (!(node = doc.getElementById(key))) {
					if (style === undefined) {
						return '';
					}
					node = doc.createElement('style');
					node.id = key;
					head.appendChild(node);
				}
				if (style === undefined) {
					return node.innerHTML;
				}
				if (style !== '') {
					node.innerHTML = node.innerHTML + '\n' + style;
				} else {
					head.removeChild(node);
				}
			},
			domReady : function(onready) {
				var doc = window.document;
				if (doc.readyState === "complete") {
					onready();
				} else {
					if (isIE) {
						(function() {
							if (doc.isReady)
								return;
							try {
								doc.documentElement.doScroll("left");
							} catch (error) {
								setTimeout(arguments.callee, 0);
								return;
							}
							onready();
						})();
						window.attachEvent('onload', function() {
							onready();
						});
					} else {
						doc.addEventListener("DOMContentLoaded", function() {
							doc.removeEventListener("DOMContentLoaded",
									arguments.callee, false);
							onready();
						}, false);
						window.addEventListener('load', function() {
							onready();
						}, false);
					}
				}

			},
			each : function(obj, iterator, context) {
				if (obj == null)
					return;
				if (obj.length === +obj.length) {
					for (var i = 0, l = obj.length; i < l; i++) {
						if (iterator.call(context, obj[i], i, obj) === false)
							return false;
					}
				} else {
					for ( var key in obj) {
						if (obj.hasOwnProperty(key)) {
							if (iterator.call(context, obj[key], key, obj) === false)
								return false;
						}
					}
				}
			},
			inArray : function(arr, item) {
				var index = -1;
				this.each(arr, function(v, i) {
					if (v === item) {
						index = i;
						return false;
					}
				});
				return index;
			},
			pushItem : function(arr, item) {
				if (this.inArray(arr, item) == -1) {
					arr.push(item);
				}
			},
			trim : function(str) {
				return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, '');
			},
			indexOf : function(array, item, start) {
				var index = -1;
				start = this.isNumber(start) ? start : 0;
				this.each(array, function(v, i) {
					if (i >= start && v === item) {
						index = i;
						return false;
					}
				});
				return index;
			},
			hasClass : function(element, className) {
				className = className.replace(/(^[ ]+)|([ ]+$)/g, '').replace(
						/[ ]{2,}/g, ' ').split(' ');
				for (var i = 0, ci, cls = element.className; ci = className[i++];) {
					if (!new RegExp('\\b' + ci + '\\b', 'i').test(cls)) {
						return false;
					}
				}
				return i - 1 == className.length;
			},
			addClass : function(elm, classNames) {
				if (!elm)
					return;
				classNames = this.trim(classNames).replace(/[ ]{2,}/g, ' ')
						.split(' ');
				for (var i = 0, ci, cls = elm.className; ci = classNames[i++];) {
					if (!new RegExp('\\b' + ci + '\\b').test(cls)) {
						cls += ' ' + ci;
					}
				}
				elm.className = utils.trim(cls);
			},
			removeClass : function(elm, classNames) {
				classNames = this.isArray(classNames) ? classNames : this.trim(
						classNames).replace(/[ ]{2,}/g, ' ').split(' ');
				for (var i = 0, ci, cls = elm.className; ci = classNames[i++];) {
					cls = cls.replace(new RegExp('\\b' + ci + '\\b'), '')
				}
				cls = this.trim(cls).replace(/[ ]{2,}/g, ' ');
				elm.className = cls;
				!cls && elm.removeAttribute('className');
			},
			on : function(element, type, handler) {
				var types = this.isArray(type) ? type : type.split(/\s+/), k = types.length;
				if (k)
					while (k--) {
						type = types[k];
						if (element.addEventListener) {
							element.addEventListener(type, handler, false);
						} else {
							if (!handler._d) {
								handler._d = {
									els : []
								};
							}
							var key = type + handler.toString(), index = utils
									.indexOf(handler._d.els, element);
							if (!handler._d[key] || index == -1) {
								if (index == -1) {
									handler._d.els.push(element);
								}
								if (!handler._d[key]) {
									handler._d[key] = function(evt) {
										return handler.call(evt.srcElement, evt
												|| window.event);
									};
								}

								element.attachEvent('on' + type,
										handler._d[key]);
							}
						}
					}
				element = null;
			},
			off : function(element, type, handler) {
				var types = this.isArray(type) ? type : type.split(/\s+/), k = types.length;
				if (k)
					while (k--) {
						type = types[k];
						if (element.removeEventListener) {
							element.removeEventListener(type, handler, false);
						} else {
							var key = type + handler.toString();
							try {
								element.detachEvent('on' + type,
										handler._d ? handler._d[key] : handler);
							} catch (e) {
							}
							if (handler._d && handler._d[key]) {
								var index = utils.indexOf(handler._d.els,
										element);
								if (index != -1) {
									handler._d.els.splice(index, 1);
								}
								handler._d.els.length == 0
										&& delete handler._d[key];
							}
						}
					}
			},
			loadFile : function() {
				var tmpList = [];
				function getItem(doc, obj) {
					try {
						for (var i = 0, ci; ci = tmpList[i++];) {
							if (ci.doc === doc
									&& ci.url == (obj.src || obj.href)) {
								return ci;
							}
						}
					} catch (e) {
						return null;
					}

				}
				return function(doc, obj, fn) {
					var item = getItem(doc, obj);
					if (item) {
						if (item.ready) {
							fn && fn();
						} else {
							item.funs.push(fn);
						}
						return;
					}
					tmpList.push({
						doc : doc,
						url : obj.src || obj.href,
						funs : [ fn ]
					});
					if (!doc.body) {
						var html = new [];
						for ( var p in obj) {
							if (p == 'tag')
								continue;
							html.push(p + '="' + obj[p] + '"');
						}
						doc.write('<' + obj.tag + ' ' + html.join(' ') + ' ></'
								+ obj.tag + '>');
						return;
					}
					if (obj.id && doc.getElementById(obj.id)) {
						return;
					}
					var element = doc.createElement(obj.tag);
					delete obj.tag;
					for ( var p in obj) {
						element.setAttribute(p, obj[p]);
					}
					element.onload = element.onreadystatechange = function() {
						if (!this.readyState
								|| /loaded|complete/.test(this.readyState)) {
							item = getItem(doc, obj);
							if (item.funs.length > 0) {
								item.ready = 1;
								for (var fi; fi = item.funs.pop();) {
									fi();
								}
							}
							element.onload = element.onreadystatechange = null;
						}
					};
					element.onerror = function() {
						throw Error('The load ' + (obj.href || obj.src)
								+ ' fails,check the url');
					};
					doc.getElementsByTagName("head")[0].appendChild(element);
				};
			}()
		};
		utils.each([ 'String', 'Function', 'Array', 'Number', 'RegExp',
				'Object', 'Boolean' ], function(v) {
			utils['is' + v] = function(obj) {
				return Object.prototype.toString.apply(obj) == '[object ' + v
						+ ']';
			};
		});
		var parselist = {};
		UEP.parse = {
			register : function(parseName, fn) {
				parselist[parseName] = fn;
			},
			load : function(opt) {
				utils.each(parselist, function(v) {
					v.call(opt, utils);
				});
			}
		};
		uParse = function(selector, opt) {
			utils.domReady(function() {
				var contents;
				if (document.querySelectorAll) {
					contents = document.querySelectorAll(selector);
				} else {
					if (/^#/.test(selector)) {
						contents = [ document.getElementById(selector.replace(
								/^#/, '')) ];
					} else if (/^\./.test(selector)) {
						var contents = [];
						utils.each(document.getElementsByTagName('*'),
								function(node) {
									if (node.className
											&& new RegExp('\\b'
													+ selector.replace(/^\./,
															'') + '\\b', 'i')
													.test(node.className)) {
										contents.push(node);
									}
								});
					} else {
						contents = document.getElementsByTagName(selector);
					}
				}
				utils.each(contents, function(v) {
					UEP.parse.load(utils.extend({
						root : v,
						selector : selector
					}, opt));
				});
			});
		};
	})();

	UEP.parse.register('insertcode', function(utils) {
		var pres = this.root.getElementsByTagName('pre');
		if (pres.length) {
			if (typeof XRegExp == "undefined") {
				var jsurl, cssurl,roomurl;
				if (this.rootPath !== undefined) {
					jsurl = utils.removeLastbs(this.rootPath)
							+ '/third-party/SyntaxHighlighter/shCore.js';
					cssurl = utils.removeLastbs(this.rootPath)
							+ '/third-party/SyntaxHighlighter/shCoreRDark.css';
					roomurl =utils.removeLastbs(this.rootPath) + '/third-party/SyntaxHighlighter/';
				} else {
					jsurl = this.highlightJsUrl;
					cssurl = this.highlightCssUrl;
					roomurl = this.roomUrl;
				}
				utils.loadFile(document, {
					id : "syntaxhighlighter_css",
					tag : "link",
					rel : "stylesheet",
					type : "text/css",
					href : cssurl
				});
				utils.loadFile(document, {
					id : "syntaxhighlighter_js",
					src : jsurl,
					tag : "script",
					type : "text/javascript",
					defer : "defer"
				}, function() {
					utils.each(pres, function(pi) {
						if (pi && /brush/i.test(pi.className)) {
							SyntaxHighlighter.autoloader(
							 	[ 'applescript',					roomurl+'shBrushAppleScript.js' ],
							 	[ 'actionscript3', 'as3',			roomurl+'shBrushAS3.js' ],
							 	[ 'bash', 'shell',					roomurl+'shBrushBash.js' ],
							 	[ 'coldfusion', 'cf',				roomurl+'shBrushColdFusion.js' ],
							 	[ 'cpp', 'c',						roomurl+'shBrushCpp.js' ],
							 	[ 'c#', 'c-sharp', 'csharp',		roomurl+'shBrushCSharp.js' ],
							 	[ 'css',							roomurl+'shBrushCss.js' ],
							 	[ 'delphi', 'pascal',				roomurl+'shBrushDelphi.js' ],
							 	[ 'diff', 'patch', 'pas',			roomurl+'shBrushDiff.js' ],
							 	[ 'erl', 'erlang',					roomurl+'shBrushErlang.js' ],
							 	[ 'groovy',							roomurl+'shBrushGroovy.js' ],
							 	[ 'java',							roomurl+'shBrushJava.js' ],
							 	[ 'jfx', 'javafx',					roomurl+'shBrushJavaFX.js' ],
							 	[ 'js', 'jscript', 'javascript',	roomurl+'shBrushJScript.js' ],
							 	[ 'perl', 'pl',						roomurl+'shBrushPerl.js' ],
							 	[ 'php',							roomurl+'shBrushPhp.js' ],
							 	[ 'text', 'plain',					roomurl+'shBrushPlain.js' ],
							 	[ 'py', 'python',					roomurl+'shBrushPython.js' ],
							 	[ 'ruby', 'rails', 'ror', 'rb',		roomurl+'shBrushRuby.js' ],
							 	[ 'scala',							roomurl+'shBrushScala.js' ],
							 	[ 'sql',							roomurl+'shBrushSql.js' ],
							 	[ 'vb', 'vbnet',					roomurl+'shBrushVb.js' ],
							 	[ 'xml', 'xhtml', 'xslt', 'html',	roomurl+'shBrushXml.js' ]
							);
							SyntaxHighlighter.all(pi);
						}
					});
				});
			} else {
				utils.each(pres, function(pi) {
					if (pi && /brush/i.test(pi.className)) {
						SyntaxHighlighter.autoloader(
							 	[ 'applescript',					roomurl+'shBrushAppleScript.js' ],
							 	[ 'actionscript3', 'as3',			roomurl+'shBrushAS3.js' ],
							 	[ 'bash', 'shell',					roomurl+'shBrushBash.js' ],
							 	[ 'coldfusion', 'cf',				roomurl+'shBrushColdFusion.js' ],
							 	[ 'cpp', 'c',						roomurl+'shBrushCpp.js' ],
							 	[ 'c#', 'c-sharp', 'csharp',		roomurl+'shBrushCSharp.js' ],
							 	[ 'css',							roomurl+'shBrushCss.js' ],
							 	[ 'delphi', 'pascal',				roomurl+'shBrushDelphi.js' ],
							 	[ 'diff', 'patch', 'pas',			roomurl+'shBrushDiff.js' ],
							 	[ 'erl', 'erlang',					roomurl+'shBrushErlang.js' ],
							 	[ 'groovy',							roomurl+'shBrushGroovy.js' ],
							 	[ 'java',							roomurl+'shBrushJava.js' ],
							 	[ 'jfx', 'javafx',					roomurl+'shBrushJavaFX.js' ],
							 	[ 'js', 'jscript', 'javascript',	roomurl+'shBrushJScript.js' ],
							 	[ 'perl', 'pl',						roomurl+'shBrushPerl.js' ],
							 	[ 'php',							roomurl+'shBrushPhp.js' ],
							 	[ 'text', 'plain',					roomurl+'shBrushPlain.js' ],
							 	[ 'py', 'python',					roomurl+'shBrushPython.js' ],
							 	[ 'ruby', 'rails', 'ror', 'rb',		roomurl+'shBrushRuby.js' ],
							 	[ 'scala',							roomurl+'shBrushScala.js' ],
							 	[ 'sql',							roomurl+'shBrushSql.js' ],
							 	[ 'vb', 'vbnet',					roomurl+'shBrushVb.js' ],
							 	[ 'xml', 'xhtml', 'xslt', 'html',	roomurl+'shBrushXml.js' ]
						);
						SyntaxHighlighter.all(pi);	//SyntaxHighlighter.hightlight(pi)
					}
				});
			}
		}

	});
	UEP.parse
			.register(
					'table',
					function(utils) {
						var me = this, root = this.root, tables = root
								.getElementsByTagName('table');
						if (tables.length) {
							var selector = this.selector;
							//追加默认的表格样式
							utils
									.cssRule(
											'table',
											selector
													+ ' table.noBorderTable td,'
													+ selector
													+ ' table.noBorderTable th,'
													+ selector
													+ ' table.noBorderTable caption{border:1px dashed #ddd !important}'
													+ selector
													+ ' table.sortEnabled tr.firstRow th,'
													+ selector
													+ ' table.sortEnabled tr.firstRow td{padding-right:20px; background-repeat: no-repeat;'
													+ 'background-position: center right; background-image:url('
													+ this.rootPath
													+ 'themes/default/images/sortable.png);}'
													+ selector
													+ ' table.sortEnabled tr.firstRow th:hover,'
													+ selector
													+ ' table.sortEnabled tr.firstRow td:hover{background-color: #EEE;}'
													+ selector
													+ ' table{margin-bottom:10px;border-collapse:collapse;display:table;}'
													+ selector
													+ ' td,'
													+ selector
													+ ' th{ background:white; padding: 5px 10px;border: 1px solid #DDD;}'
													+ selector
													+ ' caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}'
													+ selector
													+ ' th{border-top:1px solid #BBB;background:#F7F7F7;}'
													+ selector
													+ ' table tr.firstRow th{border-top:2px solid #BBB;background:#F7F7F7;}'
													+ selector
													+ ' tr.ue-table-interlace-color-single td{ background: #fcfcfc; }'
													+ selector
													+ ' tr.ue-table-interlace-color-double td{ background: #f7faff; }'
													+ selector
													+ ' td p{margin:0;padding:0;}',
											document);
							//填充空的单元格

							utils
									.each(
											'td th caption'.split(' '),
											function(tag) {
												var cells = root
														.getElementsByTagName(tag);
												cells.length
														&& utils
																.each(
																		cells,
																		function(
																				node) {
																			if (!node.firstChild) {
																				node.innerHTML = '&nbsp;';

																			}
																		});
											});

							//表格可排序
							var tables = root.getElementsByTagName('table');
							utils
									.each(
											tables,
											function(table) {
												if (/\bsortEnabled\b/
														.test(table.className)) {
													utils
															.on(
																	table,
																	'click',
																	function(e) {
																		var target = e.target
																				|| e.srcElement, cell = findParentByTagName(
																				target,
																				[
																						'td',
																						'th' ]);
																		var table = findParentByTagName(
																				target,
																				'table'), colIndex = utils
																				.indexOf(
																						table.rows[0].cells,
																						cell), sortType = table
																				.getAttribute('data-sort-type');
																		if (colIndex != -1) {
																			sortTable(
																					table,
																					colIndex,
																					me.tableSortCompareFn
																							|| sortType);
																			updateTable(table);
																		}
																	});
												}
											});

							//按照标签名查找父节点
							function findParentByTagName(target, tagNames) {
								var i, current = target;
								tagNames = utils.isArray(tagNames) ? tagNames
										: [ tagNames ];
								while (current) {
									for (i = 0; i < tagNames.length; i++) {
										if (current.tagName == tagNames[i]
												.toUpperCase())
											return current;
									}
									current = current.parentNode;
								}
								return null;
							}
							//表格排序
							function sortTable(table, sortByCellIndex,
									compareFn) {
								var rows = table.rows, trArray = [], flag = rows[0].cells[0].tagName === "TH", lastRowIndex = 0;

								for (var i = 0, len = rows.length; i < len; i++) {
									trArray[i] = rows[i];
								}

								var Fn = {
									'reversecurrent' : function(td1, td2) {
										return 1;
									},
									'orderbyasc' : function(td1, td2) {
										var value1 = td1.innerText
												|| td1.textContent, value2 = td2.innerText
												|| td2.textContent;
										return value1.localeCompare(value2);
									},
									'reversebyasc' : function(td1, td2) {
										var value1 = td1.innerHTML, value2 = td2.innerHTML;
										return value2.localeCompare(value1);
									},
									'orderbynum' : function(td1, td2) {
										var value1 = td1[utils.isIE ? 'innerText'
												: 'textContent'].match(/\d+/), value2 = td2[utils.isIE ? 'innerText'
												: 'textContent'].match(/\d+/);
										if (value1)
											value1 = +value1[0];
										if (value2)
											value2 = +value2[0];
										return (value1 || 0) - (value2 || 0);
									},
									'reversebynum' : function(td1, td2) {
										var value1 = td1[utils.isIE ? 'innerText'
												: 'textContent'].match(/\d+/), value2 = td2[utils.isIE ? 'innerText'
												: 'textContent'].match(/\d+/);
										if (value1)
											value1 = +value1[0];
										if (value2)
											value2 = +value2[0];
										return (value2 || 0) - (value1 || 0);
									}
								};

								//对表格设置排序的标记data-sort-type
								table.setAttribute('data-sort-type', compareFn
										&& typeof compareFn === "string"
										&& Fn[compareFn] ? compareFn : '');

								//th不参与排序
								flag && trArray.splice(0, 1);
								trArray = sort(
										trArray,
										function(tr1, tr2) {
											var result;
											if (compareFn
													&& typeof compareFn === "function") {
												result = compareFn
														.call(
																this,
																tr1.cells[sortByCellIndex],
																tr2.cells[sortByCellIndex]);
											} else if (compareFn
													&& typeof compareFn === "number") {
												result = 1;
											} else if (compareFn
													&& typeof compareFn === "string"
													&& Fn[compareFn]) {
												result = Fn[compareFn]
														.call(
																this,
																tr1.cells[sortByCellIndex],
																tr2.cells[sortByCellIndex]);
											} else {
												result = Fn['orderbyasc']
														.call(
																this,
																tr1.cells[sortByCellIndex],
																tr2.cells[sortByCellIndex]);
											}
											return result;
										});
								var fragment = table.ownerDocument
										.createDocumentFragment();
								for (var j = 0, len = trArray.length; j < len; j++) {
									fragment.appendChild(trArray[j]);
								}
								var tbody = table.getElementsByTagName("tbody")[0];
								if (!lastRowIndex) {
									tbody.appendChild(fragment);
								} else {
									tbody.insertBefore(fragment,
											rows[lastRowIndex
													- range.endRowIndex
													+ range.beginRowIndex - 1])
								}
							}
							//冒泡排序
							function sort(array, compareFn) {
								compareFn = compareFn
										|| function(item1, item2) {
											return item1.localeCompare(item2);
										};
								for (var i = 0, len = array.length; i < len; i++) {
									for (var j = i, length = array.length; j < length; j++) {
										if (compareFn(array[i], array[j]) > 0) {
											var t = array[i];
											array[i] = array[j];
											array[j] = t;
										}
									}
								}
								return array;
							}
							//更新表格
							function updateTable(table) {
								//给第一行设置firstRow的样式名称,在排序图标的样式上使用到
								if (!utils.hasClass(table.rows[0], "firstRow")) {
									for (var i = 1; i < table.rows.length; i++) {
										utils.removeClass(table.rows[i],
												"firstRow");
									}
									utils.addClass(table.rows[0], "firstRow");
								}
							}
						}
					});
	UEP.parse
			.register(
					'charts',
					function(utils) {

						utils.cssRule('chartsContainerHeight',
								'.edui-chart-container { height:'
										+ (this.chartContainerHeight || 300)
										+ 'px}');
						var resourceRoot = this.rootPath, containers = this.root, sources = null;

						//不存在指定的根路径， 则直接退出
						if (!resourceRoot) {
							return;
						}

						if (sources = parseSources()) {

							loadResources();

						}

						function parseSources() {

							if (!containers) {
								return null;
							}

							return extractChartData(containers);

						}

						/**
						 * 提取数据
						 */
						function extractChartData(rootNode) {

							var data = [], tables = rootNode
									.getElementsByTagName("table");

							for (var i = 0, tableNode; tableNode = tables[i]; i++) {

								if (tableNode.getAttribute("data-chart") !== null) {

									data.push(formatData(tableNode));

								}

							}

							return data.length ? data : null;

						}

						function formatData(tableNode) {

							var meta = tableNode.getAttribute("data-chart"), metaConfig = {}, data = [];

							//提取table数据
							for (var i = 0, row; row = tableNode.rows[i]; i++) {

								var rowData = [];

								for (var j = 0, cell; cell = row.cells[j]; j++) {

									var value = (cell.innerText
											|| cell.textContent || '');
									rowData.push(cell.tagName == 'TH' ? value
											: (value | 0));

								}

								data.push(rowData);

							}

							//解析元信息
							meta = meta.split(";");
							for (var i = 0, metaData; metaData = meta[i]; i++) {

								metaData = metaData.split(":");
								metaConfig[metaData[0]] = metaData[1];

							}

							return {
								table : tableNode,
								meta : metaConfig,
								data : data
							};

						}

						//加载资源
						function loadResources() {

							loadJQuery();

						}

						function loadJQuery() {

							//不存在jquery， 则加载jquery
							if (!window.jQuery) {

								utils
										.loadFile(
												document,
												{
													src : resourceRoot
															+ "/third-party/jquery-1.10.2.min.js",
													tag : "script",
													type : "text/javascript",
													defer : "defer"
												}, function() {

													loadHighcharts();

												});

							} else {

								loadHighcharts();

							}

						}

						function loadHighcharts() {

							//不存在Highcharts， 则加载Highcharts
							if (!window.Highcharts) {

								utils
										.loadFile(
												document,
												{
													src : resourceRoot
															+ "/third-party/highcharts/highcharts.js",
													tag : "script",
													type : "text/javascript",
													defer : "defer"
												}, function() {

													loadTypeConfig();

												});

							} else {

								loadTypeConfig();

							}

						}

						//加载图表差异化配置文件
						function loadTypeConfig() {

							utils.loadFile(document, {
								src : resourceRoot
										+ "/dialogs/charts/chart.config.js",
								tag : "script",
								type : "text/javascript",
								defer : "defer"
							}, function() {

								render();

							});

						}

						//渲染图表
						function render() {

							var config = null, chartConfig = null, container = null;

							for (var i = 0, len = sources.length; i < len; i++) {

								config = sources[i];

								chartConfig = analysisConfig(config);

								container = createContainer(config.table);

								renderChart(container,
										typeConfig[config.meta.chartType],
										chartConfig);

							}

						}

						/**
						 * 渲染图表
						 * @param container 图表容器节点对象
						 * @param typeConfig 图表类型配置
						 * @param config 图表通用配置
						 * */
						function renderChart(container, typeConfig, config) {

							$(container).highcharts($.extend({}, typeConfig, {

								credits : {
									enabled : false
								},
								exporting : {
									enabled : false
								},
								title : {
									text : config.title,
									x : -20
								//center
								},
								subtitle : {
									text : config.subTitle,
									x : -20
								},
								xAxis : {
									title : {
										text : config.xTitle
									},
									categories : config.categories
								},
								yAxis : {
									title : {
										text : config.yTitle
									},
									plotLines : [ {
										value : 0,
										width : 1,
										color : '#808080'
									} ]
								},
								tooltip : {
									enabled : true,
									valueSuffix : config.suffix
								},
								legend : {
									layout : 'vertical',
									align : 'right',
									verticalAlign : 'middle',
									borderWidth : 1
								},
								series : config.series

							}));

						}

						/**
						 * 创建图表的容器
						 * 新创建的容器会替换掉对应的table对象
						 * */
						function createContainer(tableNode) {

							var container = document.createElement("div");
							container.className = "edui-chart-container";

							tableNode.parentNode.replaceChild(container,
									tableNode);

							return container;

						}

						//根据config解析出正确的类别和图表数据信息
						function analysisConfig(config) {

							var series = [],
							//数据类别
							categories = [], result = [], data = config.data, meta = config.meta;

							//数据对齐方式为相反的方式， 需要反转数据
							if (meta.dataFormat != "1") {

								for (var i = 0, len = data.length; i < len; i++) {

									for (var j = 0, jlen = data[i].length; j < jlen; j++) {

										if (!result[j]) {
											result[j] = [];
										}

										result[j][i] = data[i][j];

									}

								}

								data = result;

							}

							result = {};

							//普通图表
							if (meta.chartType != typeConfig.length - 1) {

								categories = data[0].slice(1);

								for (var i = 1, curData; curData = data[i]; i++) {
									series.push({
										name : curData[0],
										data : curData.slice(1)
									});
								}

								result.series = series;
								result.categories = categories;
								result.title = meta.title;
								result.subTitle = meta.subTitle;
								result.xTitle = meta.xTitle;
								result.yTitle = meta.yTitle;
								result.suffix = meta.suffix;

							} else {

								var curData = [];

								for (var i = 1, len = data[0].length; i < len; i++) {

									curData
											.push([ data[0][i], data[1][i] | 0 ]);

								}

								//饼图
								series[0] = {
									type : 'pie',
									name : meta.tip,
									data : curData
								};

								result.series = series;
								result.title = meta.title;
								result.suffix = meta.suffix;

							}

							return result;

						}

					});
	UEP.parse.register('background',
			function(utils) {
				var me = this, root = me.root, p = root
						.getElementsByTagName('p'), styles;

				for (var i = 0, ci; ci = p[i++];) {
					styles = ci.getAttribute('data-background');
					if (styles) {
						ci.parentNode.removeChild(ci);
					}
				}

				//追加默认的表格样式
				styles
						&& utils.cssRule('ueditor_background', me.selector
								+ '{' + styles + '}', document);
			});
	UEP.parse
			.register(
					'list',
					function(utils) {
						var customCss = [], customStyle = {
							'cn' : 'cn-1-',
							'cn1' : 'cn-2-',
							'cn2' : 'cn-3-',
							'num' : 'num-1-',
							'num1' : 'num-2-',
							'num2' : 'num-3-',
							'dash' : 'dash',
							'dot' : 'dot'
						};

						utils.extend(this, {
							liiconpath : 'http://bs.baidu.com/listicon/',
							listDefaultPaddingLeft : '20'
						});

						var root = this.root, ols = root
								.getElementsByTagName('ol'), uls = root
								.getElementsByTagName('ul'), selector = this.selector;

						if (ols.length) {
							applyStyle.call(this, ols);
						}

						if (uls.length) {
							applyStyle.call(this, uls);
						}

						if (ols.length || uls.length) {
							customCss.push(selector
									+ ' .list-paddingleft-1{padding-left:0}');
							customCss.push(selector
									+ ' .list-paddingleft-2{padding-left:'
									+ this.listDefaultPaddingLeft + 'px}');
							customCss.push(selector
									+ ' .list-paddingleft-3{padding-left:'
									+ this.listDefaultPaddingLeft * 2 + 'px}');

							utils.cssRule('list', selector + ' ol,' + selector
									+ ' ul{margin:0;padding:0;}li{clear:both;}'
									+ customCss.join('\n'), document);
						}
						function applyStyle(nodes) {
							var T = this;
							utils
									.each(
											nodes,
											function(list) {
												if (list.className
														&& /custom_/i
																.test(list.className)) {
													var listStyle = list.className
															.match(/custom_(\w+)/)[1];
													if (listStyle == 'dash'
															|| listStyle == 'dot') {
														utils
																.pushItem(
																		customCss,
																		selector
																				+ ' li.list-'
																				+ customStyle[listStyle]
																				+ '{background-image:url('
																				+ T.liiconpath
																				+ customStyle[listStyle]
																				+ '.gif)}');
														utils
																.pushItem(
																		customCss,
																		selector
																				+ ' ul.custom_'
																				+ listStyle
																				+ '{list-style:none;} '
																				+ selector
																				+ ' ul.custom_'
																				+ listStyle
																				+ ' li{background-position:0 3px;background-repeat:no-repeat}');

													} else {
														var index = 1;
														utils
																.each(
																		list.childNodes,
																		function(
																				li) {
																			if (li.tagName == 'LI') {
																				utils
																						.pushItem(
																								customCss,
																								selector
																										+ ' li.list-'
																										+ customStyle[listStyle]
																										+ index
																										+ '{background-image:url('
																										+ T.liiconpath
																										+ 'list-'
																										+ customStyle[listStyle]
																										+ index
																										+ '.gif)}');
																				index++;
																			}
																		});
														utils
																.pushItem(
																		customCss,
																		selector
																				+ ' ol.custom_'
																				+ listStyle
																				+ '{list-style:none;}'
																				+ selector
																				+ ' ol.custom_'
																				+ listStyle
																				+ ' li{background-position:0 3px;background-repeat:no-repeat}');
													}
													switch (listStyle) {
													case 'cn':
														utils
																.pushItem(
																		customCss,
																		selector
																				+ ' li.list-'
																				+ listStyle
																				+ '-paddingleft-1{padding-left:25px}');
														utils
																.pushItem(
																		customCss,
																		selector
																				+ ' li.list-'
																				+ listStyle
																				+ '-paddingleft-2{padding-left:40px}');
														utils
																.pushItem(
																		customCss,
																		selector
																				+ ' li.list-'
																				+ listStyle
																				+ '-paddingleft-3{padding-left:55px}');
														break;
													case 'cn1':
														utils
																.pushItem(
																		customCss,
																		selector
																				+ ' li.list-'
																				+ listStyle
																				+ '-paddingleft-1{padding-left:30px}');
														utils
																.pushItem(
																		customCss,
																		selector
																				+ ' li.list-'
																				+ listStyle
																				+ '-paddingleft-2{padding-left:40px}');
														utils
																.pushItem(
																		customCss,
																		selector
																				+ ' li.list-'
																				+ listStyle
																				+ '-paddingleft-3{padding-left:55px}');
														break;
													case 'cn2':
														utils
																.pushItem(
																		customCss,
																		selector
																				+ ' li.list-'
																				+ listStyle
																				+ '-paddingleft-1{padding-left:40px}');
														utils
																.pushItem(
																		customCss,
																		selector
																				+ ' li.list-'
																				+ listStyle
																				+ '-paddingleft-2{padding-left:55px}');
														utils
																.pushItem(
																		customCss,
																		selector
																				+ ' li.list-'
																				+ listStyle
																				+ '-paddingleft-3{padding-left:68px}');
														break;
													case 'num':
													case 'num1':
														utils
																.pushItem(
																		customCss,
																		selector
																				+ ' li.list-'
																				+ listStyle
																				+ '-paddingleft-1{padding-left:25px}');
														break;
													case 'num2':
														utils
																.pushItem(
																		customCss,
																		selector
																				+ ' li.list-'
																				+ listStyle
																				+ '-paddingleft-1{padding-left:35px}');
														utils
																.pushItem(
																		customCss,
																		selector
																				+ ' li.list-'
																				+ listStyle
																				+ '-paddingleft-2{padding-left:40px}');
														break;
													case 'dash':
														utils
																.pushItem(
																		customCss,
																		selector
																				+ ' li.list-'
																				+ listStyle
																				+ '-paddingleft{padding-left:35px}');
														break;
													case 'dot':
														utils
																.pushItem(
																		customCss,
																		selector
																				+ ' li.list-'
																				+ listStyle
																				+ '-paddingleft{padding-left:20px}');
													}
												}
											});
						}

					});
	UEP.parse
			.register(
					'vedio',
					function(utils) {
						var video = this.root.getElementsByTagName('video'), audio = this.root
								.getElementsByTagName('audio');

						document.createElement('video');
						document.createElement('audio');
						if (video.length || audio.length) {
							var sourcePath = utils.removeLastbs(this.rootPath), jsurl = sourcePath
									+ '/third-party/video-js/video.js', cssurl = sourcePath
									+ '/third-party/video-js/video-js.min.css', swfUrl = sourcePath
									+ '/third-party/video-js/video-js.swf';

							if (window.videojs) {
								videojs.autoSetup();
							} else {
								utils.loadFile(document, {
									id : "video_css",
									tag : "link",
									rel : "stylesheet",
									type : "text/css",
									href : cssurl
								});
								utils.loadFile(document, {
									id : "video_js",
									src : jsurl,
									tag : "script",
									type : "text/javascript"
								}, function() {
									videojs.options.flash.swf = swfUrl;
									videojs.autoSetup();
								});
							}

						}
					});

})();
